﻿using Alipay.AopSdk.Core;
using Alipay.AopSdk.Core.Domain;
using Alipay.AopSdk.Core.Request;
using Alipay.AopSdk.Core.Util;
using LXYYY.DTO;
using LXYYY.IOrderService;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace LXYYY.OrderService
{
    public class ZFBService : ApplicationService, IZFBService
    {
		[HttpPost]
		[Route("PayRequest")]
        public string PayRequest(string tradeno, string subject, string totalAmout, string itemBody)
        {
			DefaultAopClient client = new DefaultAopClient(ZFBConfig.Gatewayurl, ZFBConfig.AppId, ZFBConfig.PrivateKey, "json", "2.0",
		ZFBConfig.SignType, ZFBConfig.AlipayPublicKey, ZFBConfig.CharSet, false);

			// 组装业务参数model
			AlipayTradePagePayModel model = new AlipayTradePagePayModel();
			model.Body = itemBody;
			model.Subject = subject;
			model.TotalAmount = totalAmout;
			model.OutTradeNo = tradeno;
			model.ProductCode = "FAST_INSTANT_TRADE_PAY";

			AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
			// 设置同步回调地址
			request.SetReturnUrl("http://localhost:5000/Pay/Callback");
			// 设置异步通知接收地址
			request.SetNotifyUrl("");
			// 将业务model载入到request
			request.SetBizModel(model);

			var response = client.SdkExecute(request);
			Console.WriteLine($"订单支付发起成功，订单号：{tradeno}");
            //跳转支付宝支付
            return ZFBConfig.Gatewayurl + "?" + response.Body;
        }

		/// <summary>
		/// 支付异步回调通知 需配置域名 因为是支付宝主动post请求这个action 所以要通过域名访问或者公网ip
		/// </summary>
		public async void Notify()
		{
			/* 实际验证过程建议商户添加以下校验。
			1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
			2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
			3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
			4、验证app_id是否为该商户本身。
			*/
			Dictionary<string, string> sArray = GetRequestPost();
			if (sArray.Count != 0)
			{
				bool flag = AlipaySignature.RSACheckV1(sArray, ZFBConfig.AlipayPublicKey, ZFBConfig.CharSet, ZFBConfig.SignType, false);
				if (flag)
				{
					//交易状态
					//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
					//如果有做过处理，不执行商户的业务程序

					//注意：
					//退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
					//Console.WriteLine(HttpRequest.Form["trade_status"]);

					//await Response.WriteAsync("success");
				}
				else
				{
					//await Response.WriteAsync("fail");
				}
			}
		}


		private Dictionary<string,string> GetRequestPost()
        {
			Dictionary<string, string> sArray = new Dictionary<string, string>();
			ICollection<string> requestItem = null;
			return null;
        }

	}
}
